package cn.itsource.course.service.impl;

import cn.itsource.constants.RedisKeyContants;
import cn.itsource.course.domain.CourseType;
import cn.itsource.course.mapper.CourseTypeMapper;
import cn.itsource.course.service.ICourseTypeService;
import cn.itsource.feignClents.RedisFeignClent;
import cn.itsource.utils.AjaxResult;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import net.sf.jsqlparser.expression.LongValue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author kxy
 * @since 2020-02-17
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    @Autowired
    private RedisFeignClent redisFeignClent;

    @Override
    public boolean insert(CourseType entity) {
        boolean insert = super.insert(entity);
        restRedisCourseType();
        return insert;
    }

    @Override
    public boolean deleteById(Serializable id) {
        boolean delete = super.deleteById(id);
        restRedisCourseType();
        return delete;
    }

    @Override
    public boolean updateById(CourseType entity) {
        boolean update = super.updateById(entity);
        restRedisCourseType();
        return update;
    }

    //抽取重置redis的方法
    private List<CourseType> restRedisCourseType(){

        List<CourseType> courseTypes = baseMapper.selectList(null);
        // 查询出来之后放一份放到redis中
        redisFeignClent.set(RedisKeyContants.COURSE_TYPE,JSON.toJSONString(courseTypes));
        return courseTypes;
    }
    @Override
    public List<CourseType> treeData() {

        List<CourseType> courseTypes = null;

        //需求 查询课程分类先从redis中查
        AjaxResult ajaxResult = redisFeignClent.get(RedisKeyContants.COURSE_TYPE);

        if (ajaxResult.isSuccess() && ajaxResult.getResultObj() != null){
            //此时redis中有数据 直接返回redis中的数据
            String jsonFromRedis = ajaxResult.getResultObj().toString();
            //放在redis里面的数据不需要有层级结构, JSON.parseArray 转换json格式的list集合
            courseTypes = JSON.parseArray(jsonFromRedis, CourseType.class);
        }else {
            //如果redis中没有，就去MySQL中查
            courseTypes = restRedisCourseType();
        }

        //需求要求返回树状类型的数据,父子类型
        //1.查询出CourseType中所有类型数据
        //创建一个数组用来装顶级父类
        List<CourseType> primaryCourseType = new ArrayList<>();
        //2.循环遍历找出所有的顶级父类
        for (CourseType courseType : courseTypes){
            //判断 如果pid=0那么这个课程类型就是顶级类型
            if (courseType.getPid().longValue() == 0){
                primaryCourseType.add(courseType);
            }else {
                //如果不是一级分类,就要知道自己的父分类,装到父分类中的chirdren中
                //courseType 当前分类,当前分类的pid就是父分类的id
                //定义一个变量
                CourseType crrentprimaryCourseType = null;
                for (CourseType pcourseType : courseTypes){
                    if (courseType.getPid().longValue() == pcourseType.getId().longValue()){
                        crrentprimaryCourseType = pcourseType;
                        break;
                    }
                }
                 if (crrentprimaryCourseType != null){
                     //crrentprimaryCourseType 里面有值说明找到了父分类 然后把当前分类装入父分类中
                     crrentprimaryCourseType.getChildren().add(courseType);
                 }

            }
        }
        return primaryCourseType;
    }
}
